package org.g4studio.core.net.ntp;

import java.net.DatagramPacket;

/**
 * Interface for a NtpV3Packet with get/set methods corresponding to the fields
 * in the NTP Data Message Header described in RFC 1305.
 * 
 * @author Naz Irizarry, MITRE Corp
 * @author Jason Mathews, MITRE Corp
 * @version $Revision: 165675 $ $Date: 2005-05-02 15:09:55 -0500 (Mon, 02 May
 *          2005) $
 */
public interface NtpV3Packet {

	/**
	 * Standard NTP UDP port
	 */
	public static final int NTP_PORT = 123;

	public static final int LI_NO_WARNING = 0;
	public static final int LI_LAST_MINUTE_HAS_61_SECONDS = 1;
	public static final int LI_LAST_MINUTE_HAS_59_SECONDS = 2;
	public static final int LI_ALARM_CONDITION = 3;

	/* mode options */
	public static final int MODE_RESERVED = 0;
	public static final int MODE_SYMMETRIC_ACTIVE = 1;
	public static final int MODE_SYMMETRIC_PASSIVE = 2;
	public static final int MODE_CLIENT = 3;
	public static final int MODE_SERVER = 4;
	public static final int MODE_BROADCAST = 5;
	public static final int MODE_CONTROL_MESSAGE = 6;
	public static final int MODE_PRIVATE = 7;

	public static final int NTP_MINPOLL = 4; // 16 seconds
	public static final int NTP_MAXPOLL = 14; // 16284 seconds

	public static final int NTP_MINCLOCK = 1;
	public static final int NTP_MAXCLOCK = 10;

	public static final int VERSION_3 = 3;
	public static final int VERSION_4 = 4;

	/*
	 * possible getType values such that other time-related protocols can have
	 * its information represented as NTP packets
	 */
	public static final String TYPE_NTP = "NTP"; // RFC-1305/2030
	public static final String TYPE_ICMP = "ICMP"; // RFC-792
	public static final String TYPE_TIME = "TIME"; // RFC-868
	public static final String TYPE_DAYTIME = "DAYTIME"; // RFC-867

	/**
	 * @return a datagram packet with the NTP parts already filled in
	 */
	public DatagramPacket getDatagramPacket();

	/**
	 * Set the contents of this object from the datagram packet
	 */
	public void setDatagramPacket(DatagramPacket dp);

	/**
	 * @return leap indicator as defined in RFC-1305
	 */
	public int getLeapIndicator();

	/**
	 * Set leap indicator.
	 * 
	 * @param li
	 *            - leap indicator code
	 */
	public void setLeapIndicator(int li);

	/**
	 * @return mode as defined in RFC-1305
	 */
	public int getMode();

	/**
	 * @return mode as human readable string; e.g. 3=Client
	 */
	public String getModeName();

	/**
	 * Set mode as defined in RFC-1305
	 */
	public void setMode(int mode);

	/**
	 * @return poll interval as defined in RFC-1305. Field range between
	 *         NTP_MINPOLL and NTP_MAXPOLL.
	 */
	public int getPoll();

	/**
	 * Set poll interval as defined in RFC-1305. Field range between NTP_MINPOLL
	 * and NTP_MAXPOLL.
	 */
	public void setPoll(int poll);

	/**
	 * @return precision as defined in RFC-1305
	 */
	public int getPrecision();

	/**
	 * @return root delay as defined in RFC-1305
	 */
	public int getRootDelay();

	/**
	 * @return root delay in milliseconds
	 */
	public double getRootDelayInMillisDouble();

	/**
	 * @return root dispersion as defined in RFC-1305
	 */
	public int getRootDispersion();

	/**
	 * @return root dispersion in milliseconds
	 */
	public long getRootDispersionInMillis();

	/**
	 * @return root dispersion in milliseconds
	 */
	public double getRootDispersionInMillisDouble();

	/**
	 * @return version as defined in RFC-1305
	 */
	public int getVersion();

	/**
	 * Set version as defined in RFC-1305
	 */
	public void setVersion(int mode);

	/**
	 * @return stratum as defined in RFC-1305
	 */
	public int getStratum();

	/**
	 * Set stratum as defined in RFC-1305
	 */
	public void setStratum(int stratum);

	/**
	 * @return the reference id string
	 */
	public String getReferenceIdString();

	/**
	 * @return the reference id (32-bit code) as defined in RFC-1305
	 */
	public int getReferenceId();

	/**
	 * Set reference clock identifier field.
	 * 
	 * @param refId
	 */
	public void setReferenceId(int refId);

	/**
	 * @return the transmit timestamp as defined in RFC-1305
	 */
	public TimeStamp getTransmitTimeStamp();

	/**
	 * @return the reference time as defined in RFC-1305
	 */
	public TimeStamp getReferenceTimeStamp();

	/**
	 * @return the originate time as defined in RFC-1305
	 */
	public TimeStamp getOriginateTimeStamp();

	/**
	 * @return the receive time as defined in RFC-1305
	 */
	public TimeStamp getReceiveTimeStamp();

	/**
	 * Set the transmit timestamp given NTP TimeStamp object.
	 * 
	 * @param ts
	 *            - timestamp
	 */
	public void setTransmitTime(TimeStamp ts);

	/**
	 * Set the reference timestamp given NTP TimeStamp object.
	 * 
	 * @param ts
	 *            - timestamp
	 */
	public void setReferenceTime(TimeStamp ts);

	/**
	 * Set originate timestamp given NTP TimeStamp object.
	 * 
	 * @param ts
	 *            - timestamp
	 */
	public void setOriginateTimeStamp(TimeStamp ts);

	/**
	 * Set receive timestamp given NTP TimeStamp object.
	 * 
	 * @param ts
	 *            - timestamp
	 */
	public void setReceiveTimeStamp(TimeStamp ts);

	/**
	 * Return type of time packet. The values (e.g. NTP, TIME, ICMP, ...)
	 * correspond to the protocol used to obtain the timing information.
	 * 
	 * @return packet type string identifier
	 */
	public String getType();

}
